#pragma once

#include "viml/optimization_pass.h"
#include <vector>
#include <memory>
#include <unordered_map>

namespace viml {

/**
 * 优化管道
 * 
 * 管理和执行一系列优化Pass
 */
class OptimizationPipeline {
public:
    OptimizationPipeline() = default;
    
    /**
     * 添加一个优化Pass到管道
     * @param pass Pass的unique_ptr
     * @return 管道自身引用(支持链式调用)
     */
    OptimizationPipeline& add_pass(std::unique_ptr<OptimizationPass> pass) {
        if (pass) {
            passes_.push_back(std::move(pass));
        }
        return *this;
    }
    
    /**
     * 添加一个字节码优化Pass到管道
     * @param pass Pass的unique_ptr
     * @return 管道自身引用(支持链式调用)
     */
    OptimizationPipeline& add_bytecode_pass(std::unique_ptr<BytecodePass> pass) {
        if (pass) {
            bytecode_passes_.push_back(std::move(pass));
        }
        return *this;
    }
    
    /**
     * 运行所有AST级别的Pass
     * @param program 程序AST
     * @return 是否有任何Pass发生了修改
     */
    bool run(Program* program) {
        if (!program) {
            return false;
        }
        
        bool any_changed = false;
        
        for (auto& pass : passes_) {
            if (pass && pass->is_enabled()) {
                bool changed = pass->run(program);
                if (changed) {
                    any_changed = true;
                }
            }
        }
        
        return any_changed;
    }
    
    /**
     * 运行所有字节码级别的Pass
     * @param bytecode 字节码
     * @return 是否有任何Pass发生了修改
     */
    bool run_bytecode_passes(Bytecode* bytecode) {
        if (!bytecode) {
            return false;
        }
        
        bool any_changed = false;
        
        for (auto& pass : bytecode_passes_) {
            if (pass && pass->is_enabled()) {
                bool changed = pass->run(bytecode);
                if (changed) {
                    any_changed = true;
                }
            }
        }
        
        return any_changed;
    }
    
    /**
     * 重复运行Pass直到不动点
     * @param program 程序AST
     * @param max_iterations 最大迭代次数
     * @return 实际迭代次数
     */
    size_t run_until_fixpoint(Program* program, size_t max_iterations = 10) {
        if (!program) {
            return 0;
        }
        
        size_t iterations = 0;
        while (iterations < max_iterations) {
            bool changed = run(program);
            iterations++;
            
            if (!changed) {
                break;
            }
        }
        
        return iterations;
    }
    
    /**
     * 根据名称获取Pass
     * @param name Pass名称
     * @return Pass指针,未找到返回nullptr
     */
    OptimizationPass* get_pass_by_name(const std::string& name) {
        for (auto& pass : passes_) {
            if (pass && pass->get_name() == name) {
                return pass.get();
            }
        }
        return nullptr;
    }
    
    /**
     * 根据名称获取字节码Pass
     * @param name Pass名称
     * @return Pass指针,未找到返回nullptr
     */
    BytecodePass* get_bytecode_pass_by_name(const std::string& name) {
        for (auto& pass : bytecode_passes_) {
            if (pass && pass->get_name() == name) {
                return pass.get();
            }
        }
        return nullptr;
    }
    
    /**
     * 获取所有Pass的统计信息
     * @return 统计信息列表
     */
    std::vector<PassStatistics> get_all_statistics() const {
        std::vector<PassStatistics> stats;
        
        for (const auto& pass : passes_) {
            if (pass) {
                stats.push_back(pass->get_statistics());
            }
        }
        
        for (const auto& pass : bytecode_passes_) {
            if (pass) {
                stats.push_back(pass->get_statistics());
            }
        }
        
        return stats;
    }
    
    /**
     * 重置所有Pass的状态
     */
    void reset() {
        for (auto& pass : passes_) {
            if (pass) {
                pass->reset();
            }
        }
        
        for (auto& pass : bytecode_passes_) {
            if (pass) {
                pass->reset();
            }
        }
    }
    
    /**
     * 清空管道
     */
    void clear() {
        passes_.clear();
        bytecode_passes_.clear();
    }
    
    /**
     * 获取Pass数量
     * @return Pass总数
     */
    size_t pass_count() const {
        return passes_.size() + bytecode_passes_.size();
    }
    
private:
    std::vector<std::unique_ptr<OptimizationPass>> passes_;            // AST级别的Pass
    std::vector<std::unique_ptr<BytecodePass>> bytecode_passes_;       // 字节码级别的Pass
};

} // namespace viml
